package sm.pzavoli.std;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import android.util.Log;

public class StdPojo implements IPDC {
	public static final String CSZ_SEP = "##_";
	HashMap<String, Relazione> m_relazioni; // = new HashMap<String, Relazione>(); 	
	HashMap<String, Attributo> m_attributi = new HashMap<String, Attributo>();
	
	public StdPojo() {
		initAttrs();
	}
	public HashMap<String, ProprietaAttributo> getPropAttributi() {
		return null;
	}
	
	protected void initAttrs() {		
		
	}

	public void addAttributo(String nome, Attributo attr) {
		m_attributi.put(nome, attr);
	}
	public void addAttributo(String nome, int tipo) {
		Attributo attr = new Attributo();		
		m_attributi.put(nome, attr);
	}
	public Attributo addAttributo(ProprietaAttributo prop) {
		Attributo attr = null;
		if ( prop.getType() == ColumnType.DateType)
			attr = new DateAttr(prop);
		else
			attr = new Attributo(prop);		
		m_attributi.put(prop.getNome().toLowerCase(), attr);
		return attr;
	}
	/*
	 * Restituisce l'array degli attributi di questi PDC. Ogni Attributo, a sua volta ha un 
	 * riferimento ad un ProprietaAttributo statico definito dentro ogni tiopo di PDC.
	 */
	public HashMap<String, Attributo> getAttributi() {
		return m_attributi;
	}
	
	/*
	 * Restituisce l'oggetto relazioni all'esterno.
	 */
	public HashMap<String, Relazione> getRelazioni() {
		if ( m_relazioni == null) 
			m_relazioni = new HashMap<String, Relazione>();
		return m_relazioni;
	}
	
	public void addRelazione(Relazione rel) {
		getRelazioni().put(rel.getNome(), rel);
	}
	
	/*
	 * Aggiunge dall'esterno un PDC alla relazione corrente.
	 */
	public void addPDCARelazione(String nomeRel, StdPojo pojo) throws Exception {
		try {
			Relazione rel = m_relazioni.get(nomeRel);
			if (rel != null) {
				if ( rel instanceof Relazione1) 
					((Relazione1) rel).setPDCCollegato(pojo);
				else 
					((RelazioneN) rel).addPDC(pojo);
			} else {
				throw new Exception("Relazione "+nomeRel+" non trovata");
			}
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("StdPojo","Errore in addApplicazione:"+e.getMessage());
			throw(e);
		}
	}
	
	/*
	 * Costruisce la stringa della chiave di questo pdc, separata da ##_
	 */
	public String getKeyString() {
		try {
			StringBuffer stkey = new StringBuffer();
			Iterator<Attributo> ite = getAttributi().values().iterator();
			while ( ite.hasNext()) {
				Attributo a = ite.next();
				if ( a.getProp().isKey()) {
					stkey.append(CSZ_SEP).append(a.getValue());
				}
			}			
			return stkey.toString();
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("StdPojo","getKeyString errore:"+e.getMessage());
			return null;
		}
	}
	
	public Attributo getAttributo(String nome) {
		return getAttributi().get(nome.toLowerCase());
	}
	@Override
	public boolean BeforeSave() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean AfterSave() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean BeforeUpdate() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean AfterUpdate() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean BeforeDelete() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean AfterDelete() {
		// TODO Auto-generated method stub
		return false;
	}
}
